from app.utils import getPublicData
import random
import time

travelMapData = getPublicData.getAllTravelInfoMapData()
userData =  getPublicData.getAllUsersInfoData()
# 函数目的：该函数用于统计一些特定的旅游信息数据，以便用于首页展示等相关用途，具体包括统计 5A 景区的数量、
# 评论数量最多的旅游项目标题以及出现次数最多的省份。
def getHomeTagData():
    # 实现逻辑：
    # 首先初始化几个变量：a5Len用于统计 5A 景区的数量，初始化为 0；
    a5Len = 0
    # commentsLenMax用于记录最大评论数量，初始化为 0；
    commentsLenMax = 0
    # commentsLenTitle用于记录评论数量最多的旅游项目标题，初始化为空字符串；
    commentsLenTitle = ''
    # provienceDic字典用于统计各省份出现的次数。
    provienceDic = {}
    # 接着遍历travelMapData（包含多个旅游相关信息的列表，每个元素有level、commentsLen、province等属性），
    for travel in travelMapData:
        # 如果旅游项目的等级是5A景区，则a5Len加 1。
        if travel.level == '5A景区':a5Len += 1
        # 将当前旅游项目的评论数量（通过travel.commentsLen获取并转换为整数）与已记录的最大评论数量commentsLenMax比较，
        # 如果更大，则更新commentsLenMax和对应的标题commentsLenTitle。
        if int(travel.commentsLen) > commentsLenMax:
            commentsLenMax = int(travel.commentsLen)
            commentsLenTitle = travel.title
        # 通过字典provienceDic统计各省份出现的次数，逻辑和之前常见的统计字典计数逻辑一样，即如果省份不存在于字典中则初始化为 1，存在则加 1。
        if provienceDic.get(travel.province,-1) == -1:provienceDic[travel.province] = 1
        else:provienceDic[travel.province] += 1
    # 最后对provienceDic字典按照值（省份出现次数）进行降序排序，取排序后的第一个元素（即出现次数最多的省份）的键（省份名称）赋值给provienceDicSort，

    provienceDicSort = list(sorted(provienceDic.items(),key=lambda x:x[1],reverse=True))[0][0]
    # 并返回a5Len、commentsLenTitle、provienceDicSort这三个值，可用于在首页展示相关统计标签等信息。
    return a5Len,commentsLenTitle,provienceDicSort
# 函数目的：该函数的目的是获取评分最高（评分为 5）的部分旅游项目数据以及销售数量排名前 10 的旅游项目数据。
def getAnthorData():
    # 首先创建一个空列表scoreTop10，
    scoreTop10 = []
    # 遍历travelMapData，将所有评分为5的旅游项目添加到scoreTop10列表中。
    for travel in travelMapData:
        if travel.score == '5':
            scoreTop10.append(travel)
    # 然后获取scoreTop10列表的长度赋值给maxLen，
    maxLen = len(scoreTop10)
    scoreTop10Data = []
    # 接着通过循环 10 次，每次随机生成一个在0到maxLen - 1之间的索引randomIndex，将scoreTop10中对应索引的元素添加到scoreTop10Data列表中，
    # 这样就随机获取了 10 个评分为 5 的旅游项目数据（这里随机选取的逻辑可能是为了增加展示的多样性，如果直接取前 10 个可能每次展示都一样）。
    for i in range(10):
        randomIndex = random.randint(0, maxLen - 1)
        scoreTop10Data.append(scoreTop10[randomIndex])
    # 最后通过对travelMapData列表按照旅游项目的销售数量（通过int(x.saleCount)转换为整数后进行比较）进行降序排序，
    # 并取前 10 个元素赋值给saleCountTop10，
    saleCountTop10 = list(sorted(travelMapData,key=lambda x:int(x.saleCount),reverse=True))[:10]
    # 最终返回scoreTop10Data和saleCountTop10这两组数据
    return scoreTop10Data,saleCountTop10
# 函数目的：获取当前的年、月、日信息，用于可能需要展示当前时间相关的功能场景，比如统计当日数据等。
def getNowTime():
    # 实现逻辑：使用 Python 标准库time模块的localtime函数获取当前时间的时间元组（包含了年、月、日等详细时间信息），然后分别从中提取出年、月、日
    # 对应的属性值（通过tm_year、tm_mon、tm_mday），并以元组的形式返回，方便后续使用这些时间信息进行进一步的计算或展示。
    timeFormat = time.localtime()
    year = timeFormat.tm_year
    mon = timeFormat.tm_mon
    day = timeFormat.tm_mday
    return year,mon,day
# 函数目的：统计旅游项目所在省份与另一个数据源（getPublicData.cityList）中城市相关省份的关联情况，并整理成特定格式的数据，用于地理分布相关的展示分析。
def getGeoData():
    # 实现逻辑：
    # 首先初始化一个空字典dataDic，用于统计各省份出现的关联次数。
    dataDic = {}
    # 外层循环遍历travelMapData，
    for i in travelMapData:
        # 对于每个旅游项目，内层循环遍历getPublicData.cityList（包含城市信息的列表，每个元素是一个字典，有city和province等键），
        for j in getPublicData.cityList:
            # 再内层循环遍历j['city']（即每个城市信息字典中的城市列表），通过city.find(i.province)判断城市名称中是否包含旅游项目所在的省份，
            for city in j['city']:
                # 如果包含：
                # 则对dataDic字典进行计数统计，逻辑和前面类似，若省份在字典中不存在则初始化为 1，存在则加 1。
                if city.find(i.province) != -1:
                    if dataDic.get(j['province'],-1) == -1:
                        dataDic[j['province']] = 1
                    else:
                        dataDic[j['province']] += 1
    # 之后创建一个空列表resutData，
    resutData = []
    # 遍历dataDic字典的键值对，将每个键值对包装成包含'name'（省份名称）和'value'（关联出现次数）的字典，并添加到resutData列表中，
    for key,value in dataDic.items():
        resutData.append({
            'name':key,
            'value':value
        })
    # 最终返回这个格式化后的列表，便于后续用于绘制地图等展示地理分布相关的图表。
    return resutData
# 函数目的：统计用户创建时间的分布情况，将创建时间作为键，出现的频次作为值进行统计，并整理成便于展示的格式，可能用于分析用户增长趋势等场景。
def getUserCreateTimeData():
    # 初始化一个空字典dataDic，用于统计不同用户创建时间出现的次数。
    dataDic = {}
    # 遍历userData（包含多个用户信息的列表，每个元素有createTime属性），
    for user in userData:
        # 通过字典dataDic进行计数统计，即如果用户创建时间（转换为字符串后）不存在于字典中则初始化为 1，存在则加 1。
        if dataDic.get(str(user.createTime),-1) == -1:
            dataDic[str(user.createTime)] = 1
        else:
            dataDic[str(user.createTime)] += 1
    # 然后创建一个空列表resutData，
    resutData = []
    # 遍历dataDic字典的键值对，把每个键值对转换为包含'name'（创建时间字符串）和'value'（出现次数）的字典形式添加到resutData列表中，
    for key, value in dataDic.items():
        resutData.append({
            'name': key,
            'value': value
        })
    # 最后返回这个列表，方便后续进行数据可视化展示用户创建时间的分布。
    return resutData

